home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-06-21 | 17.9 KB | 641 lines | [TEXT/edF6] |
- ***********************************************************************************
- *SIMPLE EDITOR *
- *This example application is designed to be used with the beginners guide to Mac *
- *machine code chapter 4. *
- *The code is broken into sections that relate to chapter 4. *
- *WRITTEN BY STUART BALL JULY 94 *
- ***********************************************************************************
-
- ***********************SECTION 1***************************************************
- INCLUDE EDIT_EXAMPLE_EQUS INCLUDE OUR EQUATES
- EDIT_EXAMPLE:
- **INIT MAC**
- LEA QDGLOB,A0 QUICKDRAW WORK SPACE
- LEA 202(A0),A0
- MOVE.L A0,-(SP) QDGLOB(202)
- DC.W INITGRAF INIT GRAPHICS
- DC.W INITFONTS
- MOVEQ #-1,D0
- DC.W FLUSHEVENTS
- DC.W INITWINDOWS
- DC.W INITMENUS
- CLR.L -(SP)
- DC.W INITDIALOGS
- DC.W TEINIT INIT TEXT EDITOR
- DC.W INITCURSOR
- **END OF MAC INIT**
-
- *********************SECTION 2*****************************************************
- MOVEM.L A5-A6,-(SP) SAVE MAC WORLD
- LEA VARS,A6 A6 IS OUR VARIABLES
- BSR MAKERESMENU GET MENU FROM RESOURCE FORK AND DRAW THEM
-
- BSR CLEAR_PB CLEAR PARAMETER BLOCK FOR FILE IO
- CLR.W VOLPTR(A6) EDITOR VOLUME POINTER
-
- LEA NO_W_TITLE,A0 DRAW WINDOW WITH DEFAULT TITLE
- BSR DRAW_WINDOW
-
- ********************SECTION 3*******************************************************
- MAIN_LOOP: BSR EVENTS MAIN LOOP STARTS HERE
- TST.W D0 EVENTS RETURNS -1 IF QUIT ELSE 0
- BEQ.S MAIN_LOOP END HERE WITH SHORT BRANCH
-
- ********************SECTION 4*******************************************************
- TERMINATE: BSR SHUTWINDOW CLOSE WINDOW
- MOVEM.L (SP)+,A5-A6 RESTORE REGS
- RTS BYEEEEEEEEEE
- ***************************FRAME ROUTINES******************************************
-
- *******************SECTION 5*******************************************************
- EVENTS: DC.W SYSTEMTASK LET THE MAC GET AN EYE IN
- TST.L TEHND(A6) TEXT EDITOR HANDLE
- BEQ NO_EDITOR IF ZERO NO WINDOW OPEN
- MOVE.L TEHND(A6),-(SP)
- DC.W TEIDLE
- NO_EDITOR: CLR.B -(SP) TRAP RETURNS A BYTE
- MOVE.W #$FFFF,-(SP) RETURN ANY EVENT
- PEA SEVENTREC(PC),-(SP) EVENT BUFFER ON STACK AS PARAM
- DC.W GETNEXTEVENT
- MOVE.B (SP)+,D0 THE EVENT IN D0
- EXT.W D0
- EXT.L D0
- TST.L D0
- BEQ END_EVENTS NOTHING HAPPENED
- **1ST WORD OF SEVENTREC=EVENT
- LEA SEVENTREC,A0 EVENT BUFFER
- MOVE.W (A0),D0 THE EVENT IN D0
- CMPI.W #1,D0 IF ITS 1 THEN D0 MOUSE PROCESSING
- BNE.S NOT_MOUSE
- BSR DO_MOUSE
- RTS
-
- *******************SECTION 5A******************************************************
- NOT_MOUSE: CMPI.W #3,D0 IF ITS 3 OR 5 THEN ITS A KEY PRESS
- BNE.S NOT_KEY
- BSR KEYDOWN
- RTS
- NOT_KEY: CMPI.W #5,D0
- BNE.S NOT_KEY_OTHER
- BSR KEYDOWN
- RTS
- NOT_KEY_OTHER: CMPI.W #6,D0 IF ITS 6, THEN WE NEED TO UPDATE OUR WINDOW
- BNE.S NOT_UPDATE
- BSR UPDATE
- MOVEQ #0,D0
- RTS
- NOT_UPDATE: CMPI.W #8,D0 IF ITS 8, WE NEED TO ACTIVATE OUR WINDOW
- BNE.S END_EVENTS
- BSR ACTIVATE
- END_EVENTS: MOVEQ #0,D0
- RTS
-
- ******************************KEYDOWN***********************************************
- *****************SECTION 5B*********************************************************
- KEYDOWN: LEA SEVENTREC,A0
- MOVE.W 14(A0),D1 MODIFIERS (NORMAL KEY OR MENU CLICK)
- CLR.L D0
- MOVE.B 5(A0),D0 THE KEY THAT WAS PRESSED
- ANDI.W #256,D1
- BEQ.S NORMAL_KEY KEYBOARD KEY
- **HERE ITS A MENU CLICK
-
- CLR.L -(SP) MENUKEY RETURNS A LONG
- EXT.W D0
- MOVE.W D0,-(SP) THE KEY
- DC.W MENUKEY GET MENU SELECTION
- MOVE.L (SP)+,D0 IN D0
- BSR DO_MENU PROCESS MENU SELECTION (IN MENUS.S)
- RTS
-
- *******************SECTION 5C******************************************************
- NORMAL_KEY: BSR PUTACHAR PRINT THE CHARACTER
- MOVE.W #1,DIRTY(A6) SET DIRTY FLAG - THE FILE IS MODIFIED
- MOVE.L TEHND(A6),A0 GET TEXT EDITOR HANDLE
- MOVE.L (A0),A0 POINT TO TERECORD
- **CHECK FOR VERY ROUGH SCROLLING
- MOVE.W 16(A0),D0 GET CURSOR LINE NUMBER
- CMPI.W #5,D0
- BGT NOT_OFF_TOP IF THE CURSOR Y IS > 5 ITS NOT OFF TOP
- **HERE CURSOR HAS GONE OFF THE TOP OF THE WINDOW - WE NEED SCROLL THE WINDOW DOWN
- MOVE.L SCROLLHND(A6),-(SP) SCROLL BAR HANDLE
- MOVE.L CURTOP(A6),D1 THE LAST TOP POSITION
- SUBI.L #PAGELINES-1,D1 MINUS THE NUMBER OF LINES PER PAGE
- MOVE.W D1,-(SP) ONTO STACK
- DC.W SETCTLVALUE SET THE SCROLL BAR VALUE
- BSR SCROLL SCROLL WINDOW
- BRA CURSOR_ON_PAGE
- **CHECK IF THE CURSOR HAS GONE OFF THE BOTTOM OF THE WINDOW
- NOT_OFF_TOP: CMPI.W #379,D0
- BLE CURSOR_ON_PAGE NO IT HASNT
-
- **CURSOR OFF BOTTOM OF WINDOW
- MOVE.L SCROLLHND(A6),-(SP)
- MOVE.L CURTOP(A6),D1
- ADDI.L #PAGELINES-1,D1
- MOVE.W D1,-(SP)
- DC.W SETCTLVALUE FLICK DOWN ONE PAGE
- BSR SCROLL
-
- **NOW LET SCROLL BAR KNOW HOW MANY LINES THERE ARE
- CURSOR_ON_PAGE: MOVE.L SCROLLHND(A6),-(SP)
- MOVE.W NUMBLINES(A6),-(SP)
- DC.W SETCTLMAX SET SCROLL BAR MAX NUMBER OF LINES
- CLR.L D0 RETURN 0
- RTS
-
- ********************SECTION 6*******************************************************
- *****************************UPDATE****************************************************
- UPDATE: MOVE.L WINDPTR(A6),-(SP) WINDOW HANDLE
- DC.W SETPORT TELL MAC THIS IS THE WINDOW
- MOVE.L WINDPTR(A6),-(SP)
- DC.W BEGINUPDATE
- PEA VIEWRECT,-(SP)
- MOVE.L TEHND(A6),-(SP)
- DC.W TEUPDATE
- MOVE.L WINDPTR(A6),-(SP)
- DC.W DRAWCONTROLS
- MOVE.L WINDPTR(A6),-(SP)
- DC.W ENDUPDATE
- CLR.L D0 RETURN 0
- RTS
-
- *******************SECTION 7***********************************************************
- ***********************************ACTIVATE WINDOW*************************************
- ACTIVATE: LEA SEVENTREC,A0
- MOVE.W 14(A0),D0
- ANDI.W #1,D0 WAS THE CLICK IN OUR WINDOW?
- TST.W D0
- BEQ NOT_ACTIVE NO
- **WE'VE CLICKED IN OUR WINDOW
- MOVE.L TEHND(A6),-(SP) YES
- DC.W TEACTIVATE
- RTS
- NOT_ACTIVE: MOVE.L TEHND(A6),-(SP)
- DC.W TEDEACTIVATE
- RTS
-
- *******************SECTION 8************************************************************
- *************************************DRAWWINDOW*****************************************
-
- **DRAW WINDOW NEEDS THE WINDOW TITLE IN A0
- DRAW_WINDOW: CLR.W DIRTY(A6) CLEAR DIRTY FLAG
- LEA PTITLE,A1
- BSR C_TO_P_STR CONVERT A0 TO PASCAL STRING IN A1
- **SETRECT BOUNDRECT,STARTX,STARTY,ENDX,ENDY
- PEA BOUNDRECT ARRAY FOR SETRECT
- MOVE.W #5,-(SP) RECTANGLE COORDS X1,Y1,X2,Y2
- MOVE.W #45,-(SP)
- MOVE.W #639,-(SP)
- MOVE.W #437,-(SP)
- DC.W SETRECT THE OVERALL WINDOW RECTANGLE
- **NEWWINDOW
- CLR.L -(SP)
- CLR.L -(SP)
- PEA BOUNDRECT WINDOW COORDS
- PEA PTITLE WINDOW TITLE
- MOVE.B #1,-(SP) NECESSARY PARAMETERS
- MOVE.W #4,-(SP)
- MOVE.L #-1,-(SP)
- MOVE.B #0,-(SP)
- MOVE.L #0,-(SP)
- DC.W NEWWINDOW CREATE A NEW WINDOW
- MOVE.L (SP)+,WINDPTR(A6) SAVE WINDOW HANDLE
- MOVE.L WINDPTR(A6),-(SP)
- DC.W SETPORT TELL MAC TOWORK WITH THIS WINDOW
-
- MOVE.W #4,-(SP)
- DC.W TEXTFONT SET FONT TO MONACO
- MOVE.W #9,-(SP)
- DC.W TEXTSIZE SET 9 POINT SIZE
-
- PEA VIEWRECT
- MOVE.W #4,-(SP)
- MOVE.W #5,-(SP)
- MOVE.W #614,-(SP)
- MOVE.W #437,-(SP)
- DC.W SETRECT THE VISIBLE WORKING AREA OF THE WINDOW
-
- CLR.L -(SP)
- PEA VIEWRECT
- PEA VIEWRECT
- DC.W TENEW START NEW TEXT EDITOR
- MOVE.L (SP)+,TEHND(A6) GET TE HANDLE
- CLR.L LINE_POS(A6)
- CLR.L CURTOP(A6)
- **NOW DRAW VERTICAL SCROLL BAR
- PEA BOUNDRECT
- MOVE.W #619,-(SP)
- MOVE.W #0,-(SP)
- MOVE.W #635,-(SP)
- MOVE.W #392,-(SP) COORDS OF SCROLL BAR
- DC.W SETRECT
- **NOW GET THE SCROLL HANDLE
- CLR.L -(A7)
- MOVE.L WINDPTR(A6),-(A7)
- PEA BOUNDRECT
- PEA NULL_STRING
- MOVE.B #1,-(SP)
- MOVE.W #0,-(SP)
- MOVE.W #0,-(SP)
- MOVE.W #0,-(SP)
- MOVE.W #16,-(SP)
- MOVE.L #0,-(SP)
- DC.W NEWCONTROL
- MOVE.L (SP)+,SCROLLHND(A6) SCROLL BAR HANDLE
- RTS
-
- SHUTWINDOW: MOVE.L TEHND(A6),-(SP)
- DC.W TEDISPOSE CLEAR DOWN TEXT EDITOR
- MOVE.L WINDPTR(A6),-(SP)
- DC.W DISPOSEWINDOW CLOSE OUR WINDOW
- CLR.L WINDPTR(A6) CLEAR OUR HANDLES
- CLR.L SCROLLHND(A6)
- CLR.L TEHND(A6)
- RTS
-
- *******************SECTION 9************************************************************
- **DO_ALERT NEEDS RES ID IN D0 AND RETURNS NUMBER OF BUTTON CLICKED IN D0
- DO_ALERT: CLR.W -(SP)
- MOVE.W D0,-(SP) RES ID OF ALERT
- CLR.L -(SP)
- DC.W ALERT DO ALERT
- MOVE.W (SP)+,D0 GET RESULT
- RTS
-
- *******************SECTION 10*******************************************************
- *********************************DO MOUSE*******************************************
- DO_MOUSE: LEA SEVENTREC,A0
- MOVE.L 10(A0),D7 WHERE THE MOUSE IS
- CLR.W -(SP)
- MOVE.L D7,-(SP)
- PEA WWINDOWPTR
- DC.W FINDWINDOW
- MOVE.W (SP)+,D1 WINDOW LOCATION
- CMPI.W #1,D1 IF 1, IN MENU BAR
- BNE.S NOT_MENUBAR
- CLR.L -(SP)
- MOVE.L D7,-(SP) MOUSE COORDS
- DC.W MENUSELECT GET MENU SELECTION
- MOVE.L (SP)+,D0
- BSR DO_MENU ACT ON IT
- RTS
-
- NOT_MENUBAR: CMPI.W #3,D1
- BNE NOT_WINDOW
- MOVE.L D7,MOUSE_GLBTOLOC SAVE MOUSE COORDS
- LEA MOUSE_GLBTOLOC,A0
- MOVE.L A0,-(SP)
- DC.W GLOBALTOLOCAL MAKE MOUSE COORDS RELATIVE TO WINDOW
- CLR.W -(SP)
- MOVE.L (A0),-(SP) MOUSE COORDS(LOCAL)
- MOVE.L WINDPTR(A6),-(SP)
- LEA WCTLHAND,A4
- MOVE.L A4,-(SP)
- DC.W FINDCONTROL SEE IF WE'VE CLICKED ON A SCROLLBAR CONTROL
- MOVE.W (SP)+,D0 IN D0 NOW
- EXT.L D0
- TST.L D0
- BNE NOT_SELECT IF ZERO, WE'VE SELECTED TEXT
- LEA MOUSE_GLBTOLOC,A0
- MOVE.L (A0),D0
- BSR SELECTTEXT HILIGHT THE TEXT
- BRA NOT_WINDOW BYE
- NOT_SELECT: CMPI.W #20,D0
- BNE.S NOT_UP_BUTT UP BUTTON IN SCROLL BAR?
- MOVEQ #-1,D1 YEP, SET LINES TO SCROLL IN D1
- BSR DO_SCROLL SCROLL IT
- BRA NOT_WINDOW CHOW
- NOT_UP_BUTT: CMPI.W #21,D0
- BNE.S NOT_DOWN_BUTT DOWN BUTTON?
- MOVEQ #1,D1 YUP, SET LINES TO SCROLL
- BSR DO_SCROLL SCROLL IN OTHER DIRECTION
- BRA NOT_WINDOW ASTA LA VIS....
- NOT_DOWN_BUTT: CMPI.W #22,D0
- BNE.S NOT_UP_PAGE UP A PAGE?
- SUB.L #PAGELINES,LINE_POS(A6)
- MOVE.L #-PAGELINES,D1 YES, SET LINES TO SCROLL
- BSR DO_SCROLL
- MOVE.L LINE_POS(A6),D0
- BSR SELECTTEXT POSITION CURSOR
- BRA NOT_WINDOW CIAN.......
- NOT_UP_PAGE: CMPI.W #23,D0
- BNE.S NOT_PAGE_DOWN PAGE DOWN?
- ADD.L #PAGELINES,LINE_POS(A6)
- MOVE.L #PAGELINES,D1 SCROLL DOWN THIS MANY LINES
- BSR DO_SCROLL
- MOVE.L LINE_POS(A6),D0
- BSR SELECTTEXT POSITION CURSOR
- BRA NOT_WINDOW BYE
- NOT_PAGE_DOWN: CMPI.W #129,D0 SCROLL GADGET?
- BNE NOT_WINDOW NOPE
- CLR.W -(SP)
- MOVE.L SCROLLHND(A6),-(SP)
- LEA MOUSE_GLBTOLOC,A0
- MOVE.L (A0),-(SP) MOUSE LOCAL COORDS
- CLR.L -(SP)
- DC.W TRACKCONTROL TRACK THE SCROLL GADGET (WHAT IS IT CALLED?)
- MOVE.W (A7)+,D0
- CMPI.W #129,D0
- BNE NOT_WINDOW
- BSR SCROLL SCROLL TEXT ACCORDINGLY
- NOT_WINDOW: CLR.L D0 RETURN NO ERROR
- RTS AU REVOIR
-
- WWINDOWPTR: DS.L 1 WORKING AREA FOR FINDWINDOW
- WCTLHAND: DS.L 1
- MOUSE_GLBTOLOC: DS.L 1 MOUSE LOCAL COORDS
-
- *********************SECTION 11**************************************************
- **************************UTILITY ROUTINES*****************************************
-
- **OPENSELECTOR PUTS UP A MAC FILE SELECTOR AND RETURNS FILENAME IN A0 AS C STRING
- **NEEDS ADDRESS OF BUFFER IN A0 (WHERE WE WANT THE FILE NAME TO GO)
- OPENSELECTOR: LINK A4,#-74 WORKING SPACE ON STACK
- MOVE.L #$00800080,-(SP) X/Y COORDS OF DIALOG
- CLR.L -(SP)
- CLR.L -(SP)
- MOVE.W #1,-(SP)
- PEA TYPE_STRING,-(SP) THE TYPE OF FILE (TEXT)
- CLR.L -(SP)
- MOVE.L A0,LOCAL_F_NAME ADDRESS OF WHERE THE NAME IS TO GO
- MOVE.L A0,-(SP)
- MOVE.W #2,-(SP)
- DC.W PACK3 SELECTOR
- **NOW COPY FILENAME AND CONVERT TO C
- MOVE.L LOCAL_F_NAME,A0
- CLR.L D0
- CLR.L D1
- TST.B (A0) IF FIRST BYTE OF NAME IS 0
- BEQ CANCELLED THEN WE CLICKED CANCEL
- MOVE.W 6(A0),D0 VOLREF
- **CONVERT FROM PASCAL STRING TO C STRING
- LEA 10(A0),A1 ACTUAL PASCAL STRING HERE
- MOVE.B (A1)+,D1 LENGTH OF STRING IN D1
- BRA.S DO_COPY_LOOP
- COPLOOP: MOVE.B (A1)+,(A0)+ COPY FILENAME TO WHERE WE WANT IT
- DO_COPY_LOOP: DBRA D1,COPLOOP
- CLR.B (A0)+ CLEAR LAST BYTE OF STRING
- MOVE.L LOCAL_F_NAME,A0 RETURN ADDRESS OF NAME IN A0
- UNLK A4
- RTS
- CANCELLED: CLR.L D0 NO VOLREF
- UNLK A4
- RTS
- TYPE_STRING: DC.B "TEXT",0
- EVEN
- LOCAL_F_NAME: DS.L 1
- LOCAL_PSTRING: DS.L 1
-
- **PUT UP A WRITE SELECTOR BOX
- **OPEN_WRITE NEEDS FILENAME IN A0 AND INFO STRING(SAVE THE FILE AS...) IN A1
- **ALSO VOLPTR IN D0
- **RETURNS FILENAME IN A0 AND VOLREF IN D0. IF CANCELLED D0=0
- WRITE_SELECT: MOVE.L A0,LOCAL_F_NAME
- MOVE.L A1,LOCAL_PSTRING
- LEA BUFFER,A2 100 BYTE BUFFER
- MOVE.W D0,6(A2)
- LEA 10(A2),A1 POINT OT WHERE THE FILENAME NEEDS TO GO
- MOVE.L A0,-(SP)
- MOVE.L A1,-(SP)
- BSR CTOPSTR CONVERT FILENAME TO PASCAL
- ADDQ.L #8,SP
-
- LEA PTEXTBUFFER,A1
- MOVE.L LOCAL_PSTRING,A0
- MOVE.L A0,-(SP)
- MOVE.L A1,-(SP)
- BSR CTOPSTR CONVERT INFO STRING TO PASCAL
- ADDQ.L #8,SP
- LEA BUFFER,A0
- MOVE.L #$00800080,-(SP) COORDS OF DIALOG
- PEA PTEXTBUFFER INFO STRING
- LEA 10(A0),A0
- MOVE.L A0,-(SP) FILENAME PASCAL FORMAT
- PEA 0
- PEA BUFFER WORKING BUFFER
- MOVE.W #1,-(SP)
- DC.W PACK3 WRITE SELECTOR
- LEA BUFFER,A0
- TST.B (A0)
- BNE WRITE_SEL_OK
- CLR.L D0 USER CANCELLED
- RTS BYE
-
- WRITE_SEL_OK: LEA 10(A0),A0
- MOVE.L LOCAL_F_NAME,A1 GET FILENAME
- MOVE.L A0,-(SP) PASCAL STRING
- MOVE.L A1,-(SP) WHERE WE WANT THE C STRING TO GO
- BSR PTOCSTR CONVERT PASCAL STRING TO C STRING
- ADDQ.L #8,SP CORRECT STACK
- LEA BUFFER,A0
- CLR.L D0
- MOVE.W 6(A0),D0 GET VOLPTR
- RTS
-
- BUFFER: DS.B 100
- PTEXTBUFFER: DS.B 100
- EVEN
- **************************************************************************************
- **CONVERT A C STRING TO PASCAL STRING
- **NEEDS C STRING IN A0
- **AND ADDRESS OF WHERE TO PUT THE PASCAL STRING IN A1
- **C STRING FORMAT = HELLO,0
- **PASCAL STRING FORMAT = 5,HELLO
- C_TO_P_STR: CLR.L D0
- DO_P_LOOP: MOVE.B (A0)+,D1 GET CHARACTER
- BEQ.S CTOPEND NULL STRING
- ADDQ.L #1,D0 COUNT CHARACTERS
- MOVE.B D1,0(A1,D0.L) SAVE CHARACTER IN P STRING
- BRA.S DO_P_LOOP
- CTOPEND: MOVE.B D0,(A1) PUT NUMNBER OF CHARS AT START OF STRING
- RTS
-
- **PUTACHAR PRINT THE CHARACTER IN THE LOW BYTE OF D0 USING TEKEY
- PUTACHAR: ANDI.W #$FF,D0
- MOVE.W D0,-(SP)
- MOVE.L TEHND(A6),-(SP)
- DC.W TEKEY
- BSR.S SETSCROLLMAX UPDATE SCROLL BAR
- RTS
-
- **SETSCROLLMAX TELLS THE SCROLL BAR HOW MANY LINES THERE ARE
- SETSCROLLMAX: TST.L TEHND(A6) TE ACTIVE?
- BNE.S SCROLL_BAR_OK YES
- RTS NO
- SCROLL_BAR_OK: MOVE.L TEHND(A6),A0
- MOVE.L (A0),A0 TERECORD
- CLR.L D0
- MOVE.W 94(A0),D0 NUMBER OF LINES IN EDITOR
- SUB.W #PAGELINES,D0 MINUS 1 PAGE
- BMI.S NOT_A_PAGE IF < 0, THEN WE CANT SCROLL
- MOVE.W D0,NUMBLINES(A6) UPDATE
- MOVE.L SCROLLHND(A6),-(SP)
- MOVE.W D0,-(SP)
- DC.W SETCTLMAX UPDATE SCROLL BAR
- NOT_A_PAGE: CLR.L D0
- RTS
-
- *******************SECTION 12*******************************************************
- **DO_SCROLL NEEDS WHICH PART IN D0 AND NUMBER OF LINES IN D1
- DO_SCROLL: MOVE.L D0,D6
- MOVE.L D1,D7
- WAIT_FOR_MOUSE: CLR.B -(SP) SEE IF MOUSE STILL DOWN
- DC.W STILLDOWN
- MOVE.B (SP)+,D0
- EXT.W D0
- TST.W D0
- BEQ UNLIGHT TURN OF CONTROL HIGHLIGHTED
-
- PEA WHEREMOUSE GET MOUSE COORDS HERE
- DC.W GETMOUSE
- CLR.W -(SP)
- MOVE.L SCROLLHND(A6),-(SP)
- LEA WHEREMOUSE,A0
- MOVE.L (A0),-(SP) MOUSE COORDS
- DC.W TESTCONTROL
- MOVE.W (SP)+,D0
- CMP.W D0,D6
- BNE HILITE_OFF
- MOVE.L SCROLLHND(A6),-(SP) HILITE THE PART
- MOVE.W D6,-(SP) THE PART
- DC.W HILITECONTROL
- MOVE.L SCROLLHND(A6),-(SP)
- MOVE.L CURTOP(A6),D0
- ADD.L D7,D0 LINES TO SCROLL
- MOVE.W D0,-(SP)
- DC.W SETCTLVALUE SET SCROLL BAR VALUE
- BSR SCROLL SCROLL WINDOW
- BRA WAIT_FOR_MOUSE BUTTON STILL DOWN.
- HILITE_OFF: MOVE.L SCROLLHND(A6),-(SP)
- CLR.W -(SP)
- DC.W HILITECONTROL UNLIGHT THE CONTROL
- CLR.L D1
- BRA WAIT_FOR_MOUSE
- UNLIGHT: MOVE.L SCROLLHND(A6),-(SP)
- CLR.W -(SP)
- DC.W HILITECONTROL UNLIGHT ALL CONTROLS, JUST IN CASE
- CLR.L D0
- RTS
-
- WHEREMOUSE: DS.L 1 FOR MOUSEY COORDS
-
- ***SCROLL
- SCROLL: MOVEM.L D6-D7,-(SP)
- MOVE.L CURTOP(A6),D7 GT CURRENT TOP LINE
- CLR.W -(SP)
- MOVE.L SCROLLHND(A6),-(SP)
- DC.W GETCTLVALUE GET NEW TOP LINE
- MOVE.W (SP)+,D6 GET CURTOP
- EXT.L D6
- MOVE.L D6,CURTOP(A6)
- SUB.L D6,D7 OLDTOP-CURTOP
- MULS #11,D7 TIMES FONT HIEGHT
- TST.L D7
- BEQ NO_SCROLL IF ZERO, DONT BOTHER SCROLLING
- CLR.W -(SP)
- MOVE.W D7,-(SP)
- MOVE.L TEHND(A6),-(SP)
- DC.W TESCROLL SCROLL
- NO_SCROLL: MOVEM.L (SP)+,D6-D7
- CLR.L D0
- RTS
-
- **SELECTEXT NEEDS WHERE IN D0
- SELECTTEXT: CLR.B -(SP)
- MOVE.L D0,D6
- MOVE.L D0,-(SP)
- PEA VIEWRECT,-(SP) CHECK MOUSE IS IN WINDOW!
- DC.W PTINRECT
- MOVE.B (SP)+,D1
- TST.B D1
- BEQ.S ST_END NOPE
- MOVE.L D6,-(SP)
- MOVE.B #0,-(SP)
- MOVE.L TEHND(A6),-(SP)
- DC.W TECLICK YES, HILITE TEXT
- CLR.L D0
- ST_END: RTS
-
- *********************SECTION 13*****************************************************
- ***ANOTHER WAY OF CONVERTING STRINGS, THIS TIME THE PARAMETERS ARE PASSED ON THE STACK
- CTOPSTR: LINK A6,#$0000
- CLR.L D0
- MOVEA.L $000C(A6),A0
- MOVEA.L $0008(A6),A1
- CTPLOOP: MOVE.B (A0)+,D1
- BEQ.S CTP_DONE
- ADDQ.L #$1,D0
- MOVE.B D1,$00(A1,D0.L)
- BRA.S CTPLOOP
- CTP_DONE: MOVE.B D0,(A1)
- UNLK A6
- RTS
- **PASCAL TO C CONVERT - PARAMETERS ON STACK
- PTOCSTR: LINK A6,#$0000
- CLR.L D0
- MOVEA.L $000C(A6),A0
- MOVEA.L $0008(A6),A1
- MOVE.B (A0)+,D0
- BRA.S PTCDO
- PTCLOOP: MOVE.B (A0)+,(A1)+
- PTCDO: DBF D0,PTCLOOP
- CLR.B (A1)
- UNLK A6
- RTS
-
- **SET_W_TITLE NEEDS TITLE IN A3 AS STRING
- **SETS WINDOW TITLE, WITHOUT REDRAWING THE WINDOW
- SET_W_TITLE: LEA NEW_FNAME(PC),A2 *PASCAL FILENAME BUILT HERE
- MOVE.L A3,-(A7) *WINDOW TITLE IN A3 AS A C STRING
- MOVE.L A2,-(A7) *WILL BE IN A2 AS A PASCAL STRING
- BSR CTOPSTR *CONVERT TO PASCAL STRING
- ADDQ.L #8,A7
- MOVE.L WINDPTR(A6),-(SP) *WINDOW HANDLE
- PEA NEW_FNAME(PC) *TITLE AS PASCAL
- DC.W $A91A SET WIN TITLE
- RTS
-
- ******************SECTION 14*******************************************************
- INCLUDE FILE_IO.S
- INCLUDE MENUS.S
- **********************DATA FOLLOWS*************************************************
- NO_W_TITLE: DC.B "EXAMPLE EDITOR - no file.",0 DEFAULT WINDOW TITLE
- EVEN
- NULL_STRING: DC.B 0 PASCAL NULL STRING
- EVEN
- WRITE_STRING: DC.B "Enter filename to save as.....",0
- EVEN
-
- *******************VARIABLES FOLLOW************************************************
-
- **PROGRAM GLOBALS
- SEVENTREC: DS.B 16 *SCREEN EVENT RECORD
- VIEWRECT: DS.B 8 *VIEW RECTANGLE
- BOUNDRECT: DS.B 8
- PBLOCK: DS.B 100 *PARAM BLOCK FOR I/O
- FILENAME: DS.B 64 *FILENAME AS C STRING
- PFILENAME: DS.B 64 *FILENAME AS PASCAL STRING
- TITLE: DS.B 100 *WINDOW TITLE STRING
- PTITLE: DS.B 100 *CONVERTED TO PASCAL
- QDGLOB: DS.B 206 *QUICKDRAW ARRAY
- ****OFFSETS FROM A6
-
- SCRATCH_1: EQU 0 *.L SCRATCH VARIABLES
- SCRATCH_2: EQU 4
- WINDPTR: EQU 8 *.L WINDOW HANDLE
- TEHND: EQU 12 *.L TEXT EDITOR HANDLE
- SCROLLHND: EQU 16 *.L SCROLL BAR HANDLE
- VOLPTR: EQU 20 *.W FILE POINTER
- NUMBLINES: EQU 22 *.W NUMBER OF LINES IN TE
- LINE_POS: EQU 26 *.L CURRENT LINE POSITION
- APPLEMENU: EQU 30 *.L HANDLE OF APPLE MENU
- FILEMENU: EQU 34 *.L
- EDITMENU: EQU 38 *.L
- CURTOP: EQU 42 *.L TOP OF WINDOW
- DIRTY: EQU 46 *.W FILE DIRTY WORD
- LONG_VAR: EQU 48 *.L GENERAL SCRATCH VARIABLE
- MAX_F_SIZE: EQU 52 *.L TEMPORY STOARAGE
- ******************************************************
-
- VARS: DS.W 100 *A6 VARIABLES